package com.transaction.common.util;

import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.collections4.map.HashedMap;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.math.BigDecimal;
import java.util.*;

public class FileUtil {

    private static Logger LOGGER = LoggerFactory.getLogger(FileUtil.class);

    //判断并创建文件夹
    public static void checkAndCreateDirs(String filePath) {
        File file = new File(filePath);
        if (!file.exists()) {
            file.mkdirs();
        }
    }

    //写文件
    public static void writeFile(File file, String value) {
        OutputStreamWriter out = null;
        Map<String, Object> retMap = new HashMap<String, Object>();
        try {
            out = new OutputStreamWriter(new FileOutputStream(file), ConstUtil.FILE_ENCODING);
            out.write(value);
        } catch (Exception e) {
            String error = ParamsUtil.getErrorMsg(e);
            LOGGER.error("写入文件错误" + error);
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (Exception e) {
                    String error = ParamsUtil.getErrorMsg(e);
                    LOGGER.error("写入文件错误" + error);
                }
            }
        }
    }

    /**
     * 组装文件头部
     *
     * @param versionCode  版本号
     * @param createCode   发送人编码
     * @param receiverCode 接收人编码
     * @param fileType     文件类型
     * @param handleDate   处理日期
     * @return
     */
    public static String buildFileTop(String createCode, String receiverCode, String versionCode, String handleDate, String fileType) {
        LOGGER.info("组装【{}】日的【{}】文件头部", handleDate, fileType);
        StringBuilder retValue = new StringBuilder();
        retValue.append(ConstUtil.FILE_FIRST_LINE)
                .append(ConstUtil.LINE_FEED)
                .append(versionCode + ConstUtil.LINE_FEED)
                .append(createCode + ConstUtil.LINE_FEED)
                .append(receiverCode + ConstUtil.LINE_FEED)
                .append(handleDate + ConstUtil.LINE_FEED)
                .append(ConstUtil.FILE_999 + ConstUtil.LINE_FEED)
                .append(fileType + ConstUtil.LINE_FEED)
                .append(createCode + ConstUtil.LINE_FEED)
                .append(receiverCode + ConstUtil.LINE_FEED);
        return retValue.toString();
    }

    /**
     * 组装文件字段行
     *
     * @param columnList 字段集合
     * @return
     */
    public static String buildFileColumns(List<Map<String, Object>> columnList) {
        LOGGER.info("组装文件的字段信息");
        StringBuilder retValue = new StringBuilder();
        retValue.append(DataUtil.prefixReplenishZero(String.valueOf(columnList.size()), 3))
                .append(ConstUtil.LINE_FEED);
        columnList.forEach(v -> {
            retValue.append(MapUtils.getString(v, "COLENNAME"))
                    .append(ConstUtil.LINE_FEED);
        });
        return retValue.toString();
    }

    /**
     * 组装文件数据
     *
     * @param versionCode 版本号
     * @param data        数据
     * @param columnList  字段集合
     * @return
     */
    public static String buildFileData(String versionCode, List<Map<String, Object>> data, List<Map<String, Object>> columnList) {
        LOGGER.info("组装文件内容");
        StringBuilder retValue = new StringBuilder();
        int length = 8;
        if (ConstUtil.VERSION_22.equals(versionCode)) {
            length = 16;
        }
        retValue.append(DataUtil.prefixReplenishZero(String.valueOf(data.size()), length))
                .append(ConstUtil.LINE_FEED);
        if (CollectionUtils.isNotEmpty(data)
                && CollectionUtils.isNotEmpty(columnList)) {
            data.forEach(line -> {
                columnList.forEach(v -> {
                    String colType = MapUtils.getString(v, "COLTYPE");
                    Integer colLength = MapUtils.getInteger(v, "COLLENGTH");
                    Integer colDecimal = MapUtils.getInteger(v, "COLDECIMAL");
                    String colEnName = MapUtils.getString(v, "COLENNAME");
                    String defaultValue = MapUtils.getString(v, "DEFAULTVALUE");
                    String value = MapUtils.getString(line, colEnName, defaultValue);
                    if(StringUtils.isEmpty(value)){
                        value = "";
                    }
                    //N类型前补0
                    if (ConstUtil.COLE_TYPE_N.equals(colType)) {
                        if(StringUtils.isEmpty(value)){
                            value = "0";
                        }
                        value = new BigDecimal(value).stripTrailingZeros().toPlainString();
                        //有小数位先后补0
                        if (colDecimal != 0) {
                            value = DataUtil.fillingDecimalPlaces(value, colDecimal);
                        }
                        value = DataUtil.prefixReplenishZero(value, colLength);
                    } else if (ConstUtil.COLE_TYPE_A.equals(colType) || ConstUtil.COLE_TYPE_C.equals(colType)) {//A C类型后补空格
                        value = DataUtil.suffixReplenishSpace(value, colLength);
                    }

                    //判断有无超过长度的数值
                    if (value.length() > colLength) {
                        throw new RuntimeException(colEnName + "长度：" + value.length() + "超过规定长度：" + colLength);
                    }

                    retValue.append(value);
                });
                retValue.append(ConstUtil.LINE_FEED);
            });
        }
        return retValue.toString();
    }

    /**
     * 获得索引文件名称前缀
     *
     * @param fileType 文件类型
     * @return
     */
    public static String buildIndexFileNamePrefix(String fileType) {
        String indexNamePrefix = "";
        switch (fileType) {
            case ConstUtil.FILE_TYPE_01:
            case ConstUtil.FILE_TYPE_03:
            case ConstUtil.FILE_TYPE_R1:
                indexNamePrefix = ConstUtil.INDEX_FILE_PREFIX;
                break;
            case ConstUtil.FILE_TYPE_31:
            case ConstUtil.FILE_TYPE_43:
                indexNamePrefix = ConstUtil.EL_INDEX_FILE_PREFIX;
                break;
            case ConstUtil.FILE_TYPE_X1:
            case ConstUtil.FILE_TYPE_X3:
                indexNamePrefix = ConstUtil.FXQ_INDEX_FILE_PREFIX;
                break;
            case ConstUtil.FILE_TYPE_07:
                indexNamePrefix = ConstUtil.HQ_INDEX_FILE_PREFIX;
                break;

        }
        return indexNamePrefix;
    }

    /**
     * 生成索引文件名称
     *
     * @param creatorCode  发送人编号
     * @param receiverCode 接收人编号
     * @param handleDate   处理日期
     * @param prefix       索引文件前缀
     * @return
     */
    public static String buildIndexFileName(String creatorCode, String receiverCode, String handleDate, String prefix) {
        LOGGER.info("生成索引文件名");
        StringBuilder retValue = new StringBuilder();
        retValue.append(prefix)
                .append(creatorCode + ConstUtil.UNDER_LINE)
                .append(receiverCode + ConstUtil.UNDER_LINE)
                .append(handleDate + ConstUtil.FILE_SUFFIX);
        return retValue.toString();
    }

    /**
     * 生成正式文件名称
     *
     * @param creatorCode  发送人编码
     * @param receiverCode 接收人编码
     * @param handleDate   处理日期
     * @param fileType     文件类型
     * @return
     */
    public static String buildFileName(String creatorCode, String receiverCode, String handleDate, String fileType) {
        LOGGER.info("生成【{}】的文件名", fileType);
        StringBuilder retValue = new StringBuilder();
        retValue.append(ConstUtil.FILE_PREFIX)
                .append(creatorCode + ConstUtil.UNDER_LINE)
                .append(receiverCode + ConstUtil.UNDER_LINE)
                .append(handleDate + ConstUtil.UNDER_LINE)
                .append(fileType + ConstUtil.FILE_SUFFIX);
        return retValue.toString();
    }


    /**
     * 组装索引文件内容
     *
     * @param creatorCode  发送人编码
     * @param receiverCode 接收人编码
     * @param handleDate   处理日期
     * @param fileNames    文件名称集合
     * @return
     */
    public static String buildIndexFileContent(String creatorCode, String receiverCode, String versionCode, String handleDate, List<String> fileNames) {
        StringBuilder retValue = new StringBuilder();
        int length = 0;
        if (ConstUtil.VERSION_22.equals(versionCode)) {
            length = 8;
        }
        if (ConstUtil.VERSION_21.equals(versionCode)) {
            length = 3;
        }

        retValue.append(ConstUtil.INDEX_FILE_FIRST_LINE + ConstUtil.LINE_FEED)
                .append(versionCode + ConstUtil.LINE_FEED)
                .append(creatorCode + ConstUtil.LINE_FEED)
                .append(receiverCode + ConstUtil.LINE_FEED)
                .append(handleDate + ConstUtil.LINE_FEED)
                .append(DataUtil.prefixReplenishZero(String.valueOf(fileNames.size()), length) + ConstUtil.LINE_FEED)
                .append(String.join(ConstUtil.LINE_FEED, fileNames) + ConstUtil.LINE_FEED)
                .append(ConstUtil.FILE_LAST_LINE);

        return retValue.toString();
    }

    /**
     * 组装文件名称集合  TODO
     *
     * @param creatorCode  发送人编码
     * @param receiverCode 接收人编码
     * @param handleDate   处理日期
     * @param fileType     文件类型
     * @param dealFiles    配置的处理文件类型
     * @return
     */
    public static List<String> buildIndexFileNameList(String creatorCode, String receiverCode, String handleDate, String fileType, String dealFiles) {
        List<String> fileNameList = new ArrayList<>();
        if (ConstUtil.FILE_TYPE_07.equals(fileType)) {
            fileNameList.add(buildFileName(creatorCode, receiverCode, handleDate, fileType));
        } else if (ConstUtil.FILE_TYPE_43.equals(fileType) || ConstUtil.FILE_TYPE_31.equals(fileType)) {
            fileNameList.add(buildFileName(creatorCode, receiverCode, handleDate, fileType));
        } else if (ConstUtil.FILE_TYPE_X1.equals(fileType) || ConstUtil.FILE_TYPE_X3.equals(fileType)) {
            if (dealFiles.contains(ConstUtil.FILE_TYPE_X1)) {
                fileNameList.add(buildFileName(creatorCode, receiverCode, handleDate, ConstUtil.FILE_TYPE_X1));
            }
            if (dealFiles.contains(ConstUtil.FILE_TYPE_X3)) {
                fileNameList.add(buildFileName(creatorCode, receiverCode, handleDate, ConstUtil.FILE_TYPE_X3));
            }
        } else {
            List<String> dealFileList = Arrays.asList(dealFiles.split(","));
            dealFileList.forEach(v -> {
                if (ConstUtil.FILE_TYPE_01.equals(fileType) ||
                        ConstUtil.FILE_TYPE_03.equals(fileType) ||
                        ConstUtil.FILE_TYPE_R1.equals(fileType)) {
                    if (dealFiles.contains(ConstUtil.FILE_TYPE_01)) {
                        fileNameList.add(buildFileName(creatorCode, receiverCode, handleDate, ConstUtil.FILE_TYPE_01));
                    }
                    if (dealFiles.contains(ConstUtil.FILE_TYPE_03)) {
                        fileNameList.add(buildFileName(creatorCode, receiverCode, handleDate, ConstUtil.FILE_TYPE_03));
                    }
                    if (dealFiles.contains(ConstUtil.FILE_TYPE_R1)) {
                        fileNameList.add(buildFileName(creatorCode, receiverCode, handleDate, ConstUtil.FILE_TYPE_R1));
                    }
                }
            });
        }

        return fileNameList;
    }

    /**
     * 获得文件接收路径
     *
     * @param channelCode 渠道编码
     * @param handleDate  处理日期
     * @param system      系统编码
     * @return
     */
    public static String buildReceiveFilePath(String channelCode, String handleDate, String system) {
        LOGGER.info("获得渠道【{}】，日期【{}】的接收文件路径", channelCode, handleDate);
        String filePath = File.separator + system +
                File.separator + channelCode +
                File.separator + handleDate +
                File.separator + ConstUtil.FILE_RECEIVE + File.separator;
        FileUtil.checkAndCreateDirs(filePath);
        return filePath;
    }

    /**
     * 获得文件发送路径
     *
     * @param channelCode 渠道编码
     * @param handleDate  处理日期
     * @return
     */
    public static String buildSendFilePath(String channelCode, String handleDate, String system) {
        LOGGER.info("获得渠道【{}】，日期【{}】的发送文件路径", channelCode, handleDate);
        String filePath = File.separator + system +
                File.separator + channelCode +
                File.separator + handleDate +
                File.separator + ConstUtil.FILE_SEND + File.separator;
        FileUtil.checkAndCreateDirs(filePath);
        return filePath;
    }

    /**
     * 读取文件然后写入另一处
     *
     * @param inFilePath
     * @param outFilePath
     */
    public static void readFileWriteFile(String inFilePath, String outFilePath) {
        try {
            FileInputStream fileInputStream = new FileInputStream(inFilePath);
            FileOutputStream fileOutputStream = new FileOutputStream(outFilePath);
            int len = 0;
            byte[] bytes = new byte[fileInputStream.available()];
            while ((len = fileInputStream.read(bytes)) != -1) {
                fileOutputStream.write(bytes, 0, len);
                fileOutputStream.flush();
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 解析文件
     *
     * @param creatorCode  发送人编码
     * @param receiverCode 接收人编码
     * @param versionCode  版本号
     * @param handleDate   处理日期
     * @param file         解析的文件
     * @param columnsList  文件接口字段
     * @param errorMsg     错误信息
     */
    public static Map<String,Object> analysisFile(String creatorCode, String receiverCode, String versionCode,
                                    String handleDate, File file, List<Map<String, Object>> columnsList,
                                    List<String> errorMsg) throws Exception {
        Map<String,Object> retMap = new HashedMap<>();

        List<Map<String, Object>> dataList = new ArrayList<>();
        InputStreamReader isr = new InputStreamReader(new FileInputStream(file), ConstUtil.FILE_ENCODING);;
        BufferedReader reader = new BufferedReader(isr);
        //每行内容
        String context = "";
        String contextTrim = "";
        //行号
        int line = 1;
        //字段数值
        int fieldNum = 0;
        //数据行数值
        int dataNum = 0;
        int dataNumReal = 0;
        //文件名称
        String fileName = file.getName();
        //获得文件的所有字段
        String fileFields = FileUtil.buildFileColumns(columnsList);

        boolean flag = false;

        //按行读取文件
        while ((context = reader.readLine()) != null) {
//            LOGGER.info("开始读取文件【{}】第【{}】行数据,数据值为:【{}】", fileName, line, context);
            contextTrim = context.trim();
            //第一行为固定行,文件开头
            if (line == 1) {
                LOGGER.info("【{}】文件读取开始。", fileName);
                if (!ConstUtil.FILE_FIRST_LINE.equals(contextTrim)) {
                    LOGGER.info("文件首行错误,首行内容为【{}】，应该为【{}】", contextTrim, ConstUtil.FILE_FIRST_LINE);
                    errorMsg.add("文件:" + fileName + "首行错误,首行内容为:" + context + ",应该为:" + ConstUtil.FILE_FIRST_LINE);
                    flag = true;
                }
            }

            //第2行版本号
            if (line == 2) {
                if (!versionCode.equals(contextTrim)) {
                    LOGGER.info("版本号错误,内容为【{}】，应该为【{}】", contextTrim, versionCode);
                    errorMsg.add("文件:" + fileName + "版本号错误错误,内容为:" + context + ",应该为:" + versionCode);
                    flag = true;
                }
            }
            //第3行发送人编码
            if (line == 3) {
                if (!creatorCode.equals(contextTrim)) {
                    LOGGER.info("发送人编码错误,内容为【{}】，应该为【{}】", contextTrim, creatorCode);
                    errorMsg.add("文件:" + fileName + "接收人编码错误,内容为:" + context + ",应该为:" + creatorCode);
                    flag = true;
                }
            }
            //第4行接收人编码
            if (line == 4) {
                if (!receiverCode.equals(contextTrim)) {
                    LOGGER.info("接收人编码错误,内容为【{}】，应该为【{}】", contextTrim, receiverCode);
                    errorMsg.add("文件:" + fileName + "接收人编码错误,内容为:" + context + ",应该为:" + receiverCode);
                    flag = true;
                }
            }
            //第5行日期
            if (line == 5) {
                if (!handleDate.equals(contextTrim)) {
                    LOGGER.info("日期错误,内容为【{}】，应该为【{}】", context, handleDate);
                    errorMsg.add("文件:" + fileName + "日期错误,内容为:" + contextTrim + ",应该为:" + handleDate);
                    flag = true;
                }
            }

            //第10行字段数
            if (line == 10) {
                fieldNum = Integer.valueOf(contextTrim);
                if(fieldNum != columnsList.size()){
                    flag = true;
                    LOGGER.info("字段数据行数量与规定数量不一致,规定数量为:【{}】,实际数量为:【{}】,请检查。", columnsList.size(),fieldNum);
                    errorMsg.add("文件:" + fileName + "字段数据行数量错误,规定数量为:" + columnsList.size() + ",实际数量为:" + fieldNum);
                    break;
                }
            }

            //第11行到 10+第10行数值  字段值
            if (line > 10 && line < (11 + fieldNum)) {
                if (StringUtils.isNotBlank(contextTrim) && !fileFields.contains(contextTrim.toUpperCase())) {
                    LOGGER.info("【{}】字段不在【{}】文件的接口字段中,请检查。", contextTrim, fileName);
                    errorMsg.add(contextTrim + "字段不在" + fileName + "文件的接口字段中。");
                    flag = true;
                }
            }

            //11+第10行数值 数据行数
            if (line == (11 + fieldNum)) {
                dataNum = Integer.valueOf(contextTrim);
            }

            //文件结束标识
            if (ConstUtil.FILE_LAST_LINE.equals(contextTrim)) {
                LOGGER.info("【{}】文件读取结束。", fileName);
                if(dataNumReal != dataNum){
                    flag = true;
                    LOGGER.info("数据记录行数量值与实际数据行数量不一致,记录值为:【{}】,请检查。", dataNum);
                    errorMsg.add("文件:" + fileName + "数据记录行数量值与实际数据行数量不一致,记录值为:" + dataNum);
                }
                break;
            }

            //数据行
            if (line > 11 + fieldNum) {
                dataNumReal++;
                //记录的数据行
                if(dataNumReal > dataNum){
                    flag = true;
                    LOGGER.info("数据记录行数量值与实际数据行数量不一致,记录值为:【{}】,请检查。", dataNum);
                    errorMsg.add("文件:" + fileName + "数据记录行数量值与实际数据行数量不一致,记录值为:" + dataNum);
                    break;
                }

                Map<String,Object> map = new HashMap<>();

                int index = 0;
                byte[] data = context.getBytes(ConstUtil.FILE_ENCODING);
                for (Map<String,Object> v : columnsList) {
                    String colType = MapUtils.getString(v, "COLTYPE");
                    Integer colLength = MapUtils.getInteger(v, "COLLENGTH");
                    Integer colDecimal = MapUtils.getInteger(v, "COLDECIMAL");
                    String colEnName = MapUtils.getString(v, "COLENNAME");

                    byte[] value = new byte[colLength];

                    System.arraycopy(data, index,value,0,colLength);
                    String realValue = null;
                    try {
                        realValue = new String(value,ConstUtil.FILE_ENCODING).trim();
                    } catch (Exception e) {
                        errorMsg.add(ParamsUtil.getErrorMsg(e));
                        LOGGER.error(ParamsUtil.getErrorMsg(e));
                    }

                    if(ConstUtil.COLE_TYPE_N.equals(colType)){
                        if(StringUtils.isBlank(realValue)){
                            LOGGER.warn("【{}】文件,第【{}】行的【{}】字段,类型为【数值型】,值为空字符。",fileName,line,colEnName,colType);
                            realValue = "0";
                        }else{
                            realValue = new BigDecimal(realValue.substring(0, colLength - colDecimal)
                                    + "."
                                    + realValue.substring(colLength - colDecimal)).stripTrailingZeros().toPlainString();
                        }
                    }

                    map.put(colEnName.toUpperCase(),realValue);
                    index = index + colLength;
                }
                dataList.add(map);
            }

            line++;
        }
        retMap.put("flag",flag);
        retMap.put("data",dataList);
        return retMap;
    }

    /**
     * 解析索引文件
     * @param creatorCode 发送人编码
     * @param receiverCode 接收人编码
     * @param versionCode 版本号
     * @param handleDate 处理日期
     * @param file 索引文件
     * @param fileNameSet 正式文件名称
     * @param errorMsg 错误信息
     * @return
     */
    public static boolean analysisIndexFile(String creatorCode, String receiverCode, String versionCode, String handleDate,
                                            File file, Set<String> fileNameSet,List<String> errorMsg) throws Exception{
        InputStreamReader isr = new InputStreamReader(new FileInputStream(file), ConstUtil.FILE_ENCODING);;
        BufferedReader reader = new BufferedReader(isr);
        //每行内容
        String context = "";
        String contextTrim = "";
        //行号
        int line = 1;
        //数据行数值
        int dataNum = 0;
        int dataNumReal = 0;
        //文件名称
        String fileName = file.getName();
        //记录文件名称
        Set<String> realFileNames = new HashSet<>();

        boolean flag = false;

        //按行读取文件
        while ((context = reader.readLine()) != null) {
//            LOGGER.info("开始读取索引文件【{}】第【{}】行数据,数据值为:【{}】", fileName, line, context);
            contextTrim = context.trim();
            //第一行为固定行,文件开头
            if (line == 1) {
                LOGGER.info("【{}】索引文件读取开始。", fileName);
                if (!ConstUtil.INDEX_FILE_FIRST_LINE.equals(contextTrim)) {
                    LOGGER.info("索引文件首行错误,首行内容为【{}】，应该为【{}】", contextTrim, ConstUtil.FILE_FIRST_LINE);
                    errorMsg.add("索引文件:" + fileName + "首行错误,首行内容为:" + context + ",应该为:" + ConstUtil.FILE_FIRST_LINE);
                    flag = true;
                }
            }

            //第2行版本号
            if (line == 2) {
                if (!versionCode.equals(contextTrim)) {
                    LOGGER.info("版本号错误,内容为【{}】，应该为【{}】", contextTrim, versionCode);
                    errorMsg.add("索引文件:" + fileName + "版本号错误错误,内容为:" + context + ",应该为:" + versionCode);
                    flag = true;
                }
            }
            //第3行发送人编码
            if (line == 3) {
                if (!creatorCode.equals(contextTrim)) {
                    LOGGER.info("发送人编码错误,内容为【{}】，应该为【{}】", contextTrim, creatorCode);
                    errorMsg.add("索引文件:" + fileName + "接收人编码错误,内容为:" + context + ",应该为:" + creatorCode);
                    flag = true;
                }
            }
            //第4行接收人编码
            if (line == 4) {
                if (!receiverCode.equals(contextTrim)) {
                    LOGGER.info("接收人编码错误,内容为【{}】，应该为【{}】", contextTrim, receiverCode);
                    errorMsg.add("索引文件:" + fileName + "接收人编码错误,内容为:" + context + ",应该为:" + receiverCode);
                    flag = true;
                }
            }
            //第5行日期
            if (line == 5) {
                if (!handleDate.equals(contextTrim)) {
                    LOGGER.info("日期错误,内容为【{}】，应该为【{}】", context, handleDate);
                    errorMsg.add("文件:" + fileName + "日期错误,内容为:" + contextTrim + ",应该为:" + handleDate);
                    flag = true;
                }
            }

            //第6行字段数
            if (line == 6) {
                dataNum = Integer.valueOf(contextTrim);
            }

            //文件结束标识
            if (ConstUtil.FILE_LAST_LINE.equals(contextTrim)) {
                LOGGER.info("【{}】索引文件读取结束。", fileName);
                if(dataNumReal != dataNum){
                    flag = true;
                    LOGGER.info("数据记录行数量值与实际数据行数量不一致,记录值为:【{}】,请检查。", dataNum);
                    errorMsg.add("索引文件:" + fileName + "数据记录行数量值与实际数据行数量不一致,记录值为:" + dataNum);
                }
                String dir = file.getParent();
                for (String v : realFileNames) {
                    if(!(new File(dir + File.separator + v).exists())){
                        flag = true;
                        LOGGER.info("索引文件【{}】数据行对应的正式文件有缺失,请检查。", fileName);
                        errorMsg.add("索引文件:" + fileName + "对应的正式文件:" + v + "有缺失");
                    }
                }
                break;
            }

            //大于5行数，读取文件名称
            if(line > 6){
                dataNumReal++;
                if(dataNumReal > dataNum){
                    flag = true;
                    LOGGER.info("数据记录行数量值与实际数据行数量不一致,记录值为:【{}】,请检查。", dataNum);
                    errorMsg.add("索引文件:" + fileName + "数据记录行数量值与实际数据行数量不一致,记录值为:" + dataNum);
                    break;
                }
                if(fileNameSet.contains(contextTrim))realFileNames.add(contextTrim);
            }
            line++;
        }

        return flag;
    }
}
